package P096_genericWildcard;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * Desc:&emsp;&ensp;不同的场景使用不同的泛型通配符<br/>
 * ”?“标识任意类。也可以使用extends(某个接口或类的子类)或者super(某个接口或类的父类)关键字来进一步限定
 *
 *
 * @author 李渊&emsp;liyuan7@yusys.com.cn
 * @version 1.0
 * 
 */
public class Foo {
    // 读：获取泛型参数具体内容，限定上界，使用extends
    @Test
    public <E> void test1(List<? super E> list) {
        for (Object obj:list){
            // xxx
            // 编码期完全不知道元素的类型，应该用extends
        }
    }
    @Test
    public <E> void test2(List<? extends E> list) {
        for (E obj:list){
            // xxx
        }
    }

    // 写：限定下界，使用super
    @Test
    public  void test3(List<? extends Number> list) {
//        list.add(123);
    }
    @Test
    public void test4(List<? super Number> list) {
        list.add(123);
        list.add(3.14);
    }


    public <T> void copy(List<? super T> dest,List<? extends T > src) {
        for (int i = 0; i < src.size(); i++) {
            dest.set(i,src.get(i));
        }
    }
    // 不进行限定时候，直接使用E

}
